<?php

class Widget extends Model {
    
    
    function __construct() {
        
        parent::Model();
    }
    
    
    /**
     * Запуск виджетов
     */
    public function run() {
        
        foreach($this->load() as $row) {

            //Проверка видимости
            if (!$this->is_visible($row['pages'])) continue;
            
            //Проверка кэша
            if ($row['cache'] != null) {
                
                list($name, $life) = $this->cache_name($row);
                $cache = Cache::get('widgets_'.$row['container'], $name, false, $life);
                
                if ($cache !== false) {
                
                    $this->template->set_block($row['container'], $cache);
                    continue;
                }
            }
            
            //Подготовка параметров
            if ($row['parametrs'] == NULL) {
            
                $params = array($row['modul'].'/'.$row['method']);
            }
            else {
                
                $params = array_merge(array($row['modul'].'/'.$row['method']), unserialize($row['parametrs']));
            }
            
            //Выполнение виджета
            $widget['widget_title'] = $row['title'];
            $widget['widget_text']  = call_user_func_array(array('modules', 'run'), $params);
            
            $cache = $this->template->set_block_view($row['container'], $row['container'], $widget);
            
            //Запись в кэш
            if ($row['cache'] != null) {
                
                Cache::set('widgets_'.$row['container'], $name, $cache);
            }
        }
    }
    
    
    /**
     * Загрузка виджетов
     * @return array
     */
    private function load() {
        
        if ($this->config->item('widgets', 'core_main') === false) {
            
            $this->db->order_by("order", "asc");
            $query = $this->db->get('widgets');
            
            $array = ($query->num_rows() == 0) ? array() : $query->result_array();
            
            $this->config->set_core('widgets', $array);
        }
        
        return $this->config->item('widgets', 'core_main');
    }
    
    
    /**
     * Преобразование параметров кэширования в массив
     * @param string $string Строка для преобразования
     * @return array
     */
    public function parse_cache_parametrs($string) {
        
        $parametrs = array('usergroup', 'userid', 'segment', 'reload');
        
        if (is_null($string)) {
            
            return null;
        }
        
        $string = explode(':', $string);
        
        foreach($parametrs as $key => $name) {
            
            $result[$name] = $string[$key];
        }
        
        return $result;
    }
    
    
    /**
     * Создания строки параметров кэша из массива
     * @param array $array Массив с параметрами
     * @return NULL|string
     */
    public function create_cache_parametrs($array) {

        if (!is_array($array) && count($array) <= 0) {
            
            return null;
        }
        
        $end[] = (isset($array['usergroup'])) ? 1 : 0;
        $end[] = (isset($array['userid'])) ? 1 : 0;
        $end[] = (isset($array['segment'])) ? $array['segment'] : 0;
        $end[] = (isset($array['reload'])) ? $array['reload'] : 0;
        
        return implode(':', $end);
    }
    
    
    /**
     * Выводить виджет на странице или нет
     * @param mixed $page
     * @return boolean
     */
    private function is_visible($page) {
        
        if ($page == NULL) {
            
            return true;
        }
        
        $page = unserialize($page);
        
        if (in_array($this->uri->current_uri(), $page)) {
            
            return true;
        }
        
        return false;
    }
    
    
    /**
     * Составление имени и время жизни кэши из параметров
     * @param array $array Параметры виджета
     * @return multitype:string Ambigous <string, int> 
     */
    private function cache_name(array $array) {
        
        $life  = 0;
        $name  = array($array['modul'], $array['method'], $array['id']); 
        $cache = $this->parse_cache_parametrs($array['cache']);
        
        if ($cache['usergroup'] == 1) {
            
            $name[] = $this->usr->group;
        }
        
        if ($cache['userid'] == 1) {
            
            $name[] = $this->usr->group;
        }
        
        if ($cache['segment'] > 0 && $this->uri->segment($cache['segment'])) {
            
            $name[] = $this->uri->segment($cache['segment'], '_none');
        }
        
        if ($cache['reload'] > 0) {
            
            $life = $cache['reload'];
        }
        
        return array(implode('_', $name), $life);
    }
}